package com.talos.framework.mybatis.core.util;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.talos.framework.mybatis.core.dataobject.BaseDO;

public final class QueryUtils {

    private QueryUtils() {

    }

    public static <T extends BaseDO> QueryWrapper<T> newQueryWrapper() {
        return Wrappers.query();
    }

    public static <T extends BaseDO> LambdaQueryWrapper<T> newLambdaWrapper() {
        QueryWrapper<T> wrapper = QueryUtils.newQueryWrapper();

        return wrapper.lambda();
    }

    public static <T extends BaseDO> LambdaQueryWrapper<T> newLambdaWrapper(SFunction<T, ?> sorting) {
        return QueryUtils.newLambdaWrapper(sorting, false);
    }

    public static <T extends BaseDO> LambdaQueryWrapper<T> newLambdaWrapper(SFunction<T, ?> sorting, boolean desc) {
        QueryWrapper<T> wrapper = QueryUtils.newQueryWrapper();

        if (desc) {
            return wrapper.lambda().orderByDesc(sorting);
        }

        return wrapper.lambda().orderByAsc(sorting);
    }

//    public static <Q extends QueryDTO, T extends BaseDO> QueryWrapper<T> newQueryWrapper(Q dto) {
//        QueryWrapper<T> wrapper = QueryUtils.newQueryWrapper();
//
//        // 模糊查询
//        if (EmptyUtils.isNotEmpty(dto.getKeywords())) {
//            KeywordsSearch keywordsSearch = dto.getClass().getAnnotation(KeywordsSearch.class);
//
//            if (keywordsSearch != null) {
//                List<String> values = Arrays.asList(keywordsSearch.value());
//
//                wrapper.and(sw -> ListUtils.foreach(values, s -> sw.or().like(s, dto.getKeywords())));
//            }
//        }
//
//        // 字段查询
//        ClassUtils.forAllFields(dto, field -> {
//            FieldSearch fieldSearch = field.getAnnotation(FieldSearch.class);
//
//            if (fieldSearch == null) {
//                return;
//            }
//
//            field.setAccessible(true);
//
//            Object value;
//
//            try {
//                value = field.get(dto);
//            } catch (IllegalAccessException ex) {
//                throw new RuntimeException(ex);
//            }
//
//            // 有值才查询
//            if (!EmptyUtils.hasValue(value)) {
//                return;
//            }
//
//            String methodName = fieldSearch.between();
//
//            // between 查询
//            if (EmptyUtils.isNotEmpty(methodName)) {
//                Method method;
//
//                try {
//                    method = dto.getClass().getMethod(methodName);
//                } catch (NoSuchMethodException ex) {
//                    throw new RuntimeException(
//                            String.format("类「%s」不存在方法【%s】", dto.getClass().getSimpleName(), methodName)
//                    );
//                }
//
//                method.setAccessible(true);
//
//                Object betweenValue;
//
//                try {
//                    betweenValue = method.invoke(dto);
//                } catch (IllegalAccessException | InvocationTargetException ex) {
//                    throw new RuntimeException(
//                            String.format("访问类「%s」方法【%s】失败", dto.getClass().getSimpleName(), methodName)
//                    );
//                }
//
//                if (EmptyUtils.hasValue(betweenValue)) {
//                    wrapper.and(sw -> sw.between(fieldSearch.value(), value, betweenValue));
//                }
//
//                return;
//            }
//
//            wrapper.and(sw -> QueryUtils.buildSql(sw, fieldSearch, value));
//        });
//
//        // 禁用查询
//        if (dto instanceof QueryDTOWithDisable) {
//            Integer disableFlag = ((QueryDTOWithDisable) dto).getDisableFlag();
//
//            if (BooleanEnums.isTrue(disableFlag)) {
//                wrapper.isNotNull(SystemConstant.DISABLE_KEY_NAME);
//            } else if (BooleanEnums.isFalse(disableFlag)) {
//                wrapper.isNull(SystemConstant.DISABLE_KEY_NAME);
//            }
//        }
//
//        return wrapper;
//    }
//
//    public static <T> void buildSql(QueryWrapper<T> wrapper, FieldSearch fieldSearch, Object value) {
//        // in 查询
//        if (fieldSearch.in()) {
//            if (!(value instanceof Collection)) {
//                throw new RuntimeException("in查询值必须是一个集合");
//            }
//
//            wrapper.in(fieldSearch.value(), (Collection<?>) value);
//        }
//        // like 查询
//        else if (fieldSearch.like()) {
//            wrapper.like(fieldSearch.value(), value);
//        }
//        // likeLeft 查询
//        else if (fieldSearch.likeLeft()) {
//            wrapper.likeLeft(fieldSearch.value(), value);
//        }
//        // likeRight 查询
//        else if (fieldSearch.likeRight()) {
//            wrapper.likeRight(fieldSearch.value(), value);
//        }
//        // gt 查询
//        else if (fieldSearch.gt()) {
//            wrapper.gt(fieldSearch.value(), value);
//        }
//        // ge 查询
//        else if (fieldSearch.ge()) {
//            wrapper.ge(fieldSearch.value(), value);
//        }
//        // lt 查询
//        else if (fieldSearch.lt()) {
//            wrapper.lt(fieldSearch.value(), value);
//        }
//        // le 查询
//        else if (fieldSearch.le()) {
//            wrapper.le(fieldSearch.value(), value);
//        }
//        // = 查询
//        else {
//            wrapper.eq(fieldSearch.value(), value);
//        }
//    }

}
